package com.dyna.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.dyna.core.context.TenantContextHolder;
import com.dyna.domain.resp.PageResult;
import com.dyna.foundation.domain.entity.SysTenant;
import com.dyna.foundation.domain.form.SysTenantSaveForm;
import com.dyna.foundation.domain.req.SysTenantPageReq;
import com.dyna.handler.TenantInfoHandler;

import javax.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 租户 Service 接口
 *
 * @author 芋道源码
 */
public interface SysTenantService extends IService<SysTenant> {

    /**
     * 获得名字对应的租户
     *
     * @param name 租户名
     * @return 租户
     */
    SysTenant getTenantByName(String name);

    /**
     * 获得域名对应的租户
     *
     * @param website 域名
     * @return 租户
     */
    SysTenant getTenantByWebsite(String website);

    /**
     * 获得指定状态的租户列表
     *
     * @param status 状态
     * @return 租户列表
     */
    List<SysTenant> getTenantListByStatus(Integer status);

    /**
     * 获得租户精简信息列表
     *
     * @return 租户精简信息列表
     */
    PageResult<SysTenant> getTenantPage(SysTenantPageReq pageVO);

    /**
     * 创建租户
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTenant(@Valid SysTenantSaveForm createReqVO);

    /**
     * 更新租户
     *
     * @param updateReqVO 更新信息
     */
    void updateTenant(@Valid SysTenantSaveForm updateReqVO);

    /**
     * 删除租户
     *
     * @param id 编号
     */
    void deleteTenant(Long id);

    /**
     * 获得租户
     *
     * @param id 编号
     * @return 租户
     */
    SysTenant getTenant(Long id);

    /**
     * 进行租户的信息处理逻辑
     * 其中，租户编号从 {@link TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantInfo(TenantInfoHandler handler);

    /**
     * 更新租户的角色菜单
     *
     * @param tenantId 租户编号
     * @param menuIds  菜单编号数组
     */
    void updateTenantRoleMenu(Long tenantId, Set<Long> menuIds);

    /**
     * 获得使用指定套餐的租户数组
     *
     * @param packageId 租户套餐编号
     * @return 租户数组
     */
    List<SysTenant> getTenantListByPackageId(Long packageId);

    /**
     * 获得使用指定套餐的租户数量
     *
     * @param packageId 租户套餐编号
     * @return 租户数量
     */
    Long getTenantCountByPackageId(Long packageId);


}
